package touch;

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.os.Handler;
import android.os.IBinder;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.FrameLayout;

import static android.content.Context.INPUT_METHOD_SERVICE;

/**
 * Created by an on 2016/11/27.<br/>
 * 软键盘util
 */

public class SoftInputUtil {

  private static final Handler mHandler = new Handler();

  /**
   * 隐藏键盘
   */
  public static void hideSoftInput(Context context, IBinder token) {
    if (token != null) {
      InputMethodManager im =
          (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
      im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
    }
  }

  /**
   * 隐藏键盘
   */
  public static void hideSoftInput(Activity activity) {
    View focus = activity.getCurrentFocus();
    if (focus != null) {
      IBinder focusBinder = focus.getWindowToken();
      hideSoftInput(activity, focusBinder);
      //if (focusBinder != null) {
      //  ((InputMethodManager) activity.getSystemService(
      //    INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(focusBinder,
      //    InputMethodManager.HIDE_NOT_ALWAYS);
      //}
    }
  }

  /**
   * 显示键盘
   */
  public static void showInputWindow(Context context, EditText mEditText) {
    ((InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(mEditText,
        0);
  }

  /**
   * 点击EditText外任意区域使软键盘消失
   * 在{@link Activity {@link #dispatchTouchEvent(Activity, MotionEvent)}}中调用，
   * 然后返回super.dispatchTouchEvent(ev)即可
   */
  public static void dispatchTouchEvent(final Activity activity, final MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
      // 获得当前得到焦点的View，一般情况下就是EditText（特殊情况就是轨迹求或者实体案件会移动焦点）
      mHandler.postDelayed(new Runnable() {
        @Override public void run() {
          View v = activity.getCurrentFocus();
          if (isShouldHideInput(v, ev)) {
            hideSoftInput(activity, v.getWindowToken());
          }
        }
      }, 100); // 这里如果不post会有问题，如从一个edittext点击到另一个edittext，获取的聚焦的view是前一个edittext
    }
    // 还有另外一种方式就是遍历所有的decorview的子view中是edittext的执行isShouldHideInput判断。
    //FrameLayout decorView = (FrameLayout) activity.getWindow().getDecorView();


    //return super.dispatchTouchEvent(ev);
  }

  /**
   * 根据EditText所在坐标和用户点击的坐标相对比，来判断是否隐藏键盘，因为当用户点击EditText时没必要隐藏
   */
  public static boolean isShouldHideInput(View view, MotionEvent ev) {
    if (view != null && (view instanceof EditText)) {
      Rect rect = new Rect();
      view.getGlobalVisibleRect(rect);
      return !rect.contains((int) ev.getRawX(), (int) ev.getRawY());

      //int[] l = { 0, 0 };
      //view.getLocationInWindow(l);
      //int left = l[0], top = l[1], bottom = top + view.getHeight(), right = left + view.getWidth();
      //if (ev.getX() > left && ev.getX() < right && ev.getY() > top && ev.getY() < bottom) {
      //  // 点击EditText的事件，忽略它。
      //  return false;
      //} else {
      //  return true;
      //}
    }
    return false;
  }
}
